use std::fmt;

#[derive(Debug)]
struct Structure(i32);

// 实现 fmt.Display 显示
impl fmt::Display for Structure {
    // 这个 trait 要求 `fmt` 使用与下面的函数完全一致的函数签名
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        // 仅将 self 的第一个元素写入到给定的输出流 `f`。返回 `fmt:Result`，此
        // 结果表明操作成功或失败。注意 `write!` 的用法和 `println!` 很相似。
        write!(f, "{}", self.0)
    }
}

fn main() {
    // Structure(
    //    222,
    // )
    println!("{:#?}", Structure(222));

    // Structure(222)
    println!("{:?}", Structure(222));

    // 222
    println!("{}", Structure(222));

    // ============ 示例 ================
    // Display: 3.3 + 7.2i
    // Debug: Complex { real: 3.3, imag: 7.2 }

    #[derive(Debug)]
    struct Complex {
        real: f32,
        imag: f32,
    }

    impl fmt::Display for Complex {
        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
            write!(f, "real: {}, imap: {}i", self.real, self.imag)
        }
    }

    println!(
        "{:?}",
        Complex {
            real: 3.3,
            imag: 7.2
        }
    );
}
